package com.mrdeer.common;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 自定义响应数据结构,本类可提供给H5/iOS/安卓/公众号/小程序 使用
 * 前端接受此类数据(JSON Object)后，可自行根据业务区实现相关功能
 * 200:表示成功
 * 500:表示错误，错误信息在msg字段中
 * 501:bean验证错误，不管多少个错误都以map形式返回
 * 502:拦截器拦截到用户token出错
 * 555:异常抛出信息
 * 556:用户QQ校验异常
 *
 * @Author: xie jianchu
 */
public class JSONResult {
    /**
     * 定义Jackson对象
     */
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 响应业务状态
     */
    private Integer status;

    /**
     * 响应消息
     */
    private String message;
    /**
     * 响应中的数据
     */
    private Object result;
    /**
     *
     */
    @JsonIgnore
    private String ok;

    public static JSONResult build(Integer status, String msg, Object data) {
        return new JSONResult(status, msg, data);
    }

    public static JSONResult build(Integer status, String msg, Object data, String ok) {
        return new JSONResult(status, msg, data, ok);
    }

    public static JSONResult ok(Object data) {
        return new JSONResult(data);
    }

    public static JSONResult ok(Object data, String msg) {
        return build(200, msg, data);
    }

    public static JSONResult ok() {
        return new JSONResult(null);
    }

    public static JSONResult errorMsg(String msg) {
        return new JSONResult(500, msg, null);
    }

    public static JSONResult errorMap(Object data) {
        return new JSONResult(501, "error", data);
    }

    public static JSONResult errorTokenMsg(String msg) {
        return new JSONResult(502, msg, null);
    }

    public static JSONResult errorException(String msg) {
        return new JSONResult(555, msg, null);
    }

    public JSONResult() {
    }

    public JSONResult(Integer status, String message, Object result) {
        this.status = status;
        this.message = message;
        this.result = result;
    }

    public JSONResult(Integer status, String message, Object result, String ok) {
        this.status = status;
        this.message = message;
        this.result = result;
        this.ok = ok;
    }

    public JSONResult(Object result) {
        this.status = 200;
        this.message = "OK";
        this.result = result;
    }

    public static JSONResult errorMsg(int status, String msg) {
        return build(status, msg, null);
    }

    public Boolean isOK() {
        return this.status == 200;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }

    public String getOk() {
        return ok;
    }

    public void setOk(String ok) {
        this.ok = ok;
    }
}
